Google Drive のデータをクラウドサービス経由で別のアカウントに移す
GSuite アカウントであればデータのエクスポートが容易ですが、普通の Google Drive 課金アカウントから別のアカウントに移す場合、手元に空き容量がないと困ってしまいます。
今回は手元のMBPに10GB程度しか空き容量がないのに300GBぐらいのデータを別の Google アカウントに移したくなった時に行った手筈を紹介します。
使うもの
Skicka
google 名前空間にあるものの非公式プロジェクトらしい Go 製 Google Drive CLI アプリ
ファイルのダウンロード・アップロード
Lightsail はたしか月 1TB とか通信無料なので普通の移行なら追加ディスクぶっさして余裕かも
各 Credit とかが見えないしあんまり書くと普通に引っかかるのかなあという気もしてきた
重複ファイルのリネーム・スラッシュが入ったファイルの調査に使います
手順
やりたい場合やる前に絶対最後まで一読してくださいね
重複ファイルはどちらも残って欲しい時のみの手順
いったん手元に Skicka を導入します
インスタンス立ててからやってもいいです
落としたいディレクトリの donwload オペレーションを /tmp 相手にでもやります
重複ファイル・スラッシュが入ったディレクトリが表示されるので、即終了します
<重複ファイルがあった場合> Colab Notebook に新しいノートを作って、移行元 Google アカウントで Drive をマウントします
code:rename.py
import pathlib
d = """重複したディレクトリのリストのテキスト"""
for line in d.split("\n"):
if line.startswith("skicka:") and "mkdir" not in line:
prefix, path, msg = line.split(": ")
if "skipping download of duplicate file on Drive" in msg:
p = pathlib.Path(f"/content/gdrive/My Drive/{path}")
if p.exists():
print(f"リネームします: {path}")
p.rename(p.with_name(f"{p.stem}_{p.suffix}"))
else:
print(f"なかったです: {path}")
中身を理解してから実行してください
セットアップ
GCE で
us-central
g2-small (メモリ1.7GB、おまかせ)
ブートディスク
SSD
10GB
CentOS
追加ディスク
HDD
移したいデータが入るぐらいの容量
のインスタンスを作ってください
us-central なのは今回の用途では日本からの速度が重要ではないからです
Google APIに問題なくつながればいいので
追加ディスクがHDDなのはSSDにしても Google Drive から落ちてくる速度がそんなでないのであんま意味ないからです
SSDの価格はHDDの4倍です
インスタンス
インスタンスに接続
code:bash.sh
$ sudo yum install -y wget tmux
$ sudo tar -C /usr/local -xzf gotab $ vim .bash_profile
code:.bash_profile
export PATH=$PATH:$HOME/bin:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
code:bash.sh
# いったん落ちてもいいし source で反映させてもいいです
$ go get github.com/google/skicka
$ skicka init
# 書いた時点では skicka の CSCK が無効化されてるので
$ vim .skicka.config
code:.skicka.config
clientid=取ってきたclientid
clientsecret=取ってきた
code:bash.sh
$ skicka -no-browser-auth ls
ディスクのマウント
code:mount.sh
$ sudo lsblk
# 一番下に出てくる sdb みたいなのが追加でマウントしたディスク
$ sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb # 最初だけ
$ sudo mkdir -p /mnt/disks/sdb # 最初だけ
$ sudo mount -o discard,defaults /dev/sdb /mnt/disks/sdb
$ sudo chmod a+w /mnt/disks/sdb
tmux に入ります
code:in tmux.sh
$ cd /mnt/disks/sdb
$ mkdir -p ... # ダウンロードしたいディレクトリ相対構造(自由)
適当に d でデタッチしても作業進んでるので終わるまで放置します
今筆者が終わるまで放置してるので終わったら残り追記します
code:110GBのダウンロード
2020/02/23 06:02:06 Preparation time 8s, sync time 12h 56m 51s
2020/02/23 06:02:06 Updated 0 Drive files, 203911 local files
2020/02/23 06:02:06 0 B read from disk, 109.83 GiB written to disk
2020/02/23 06:02:06 0 B uploaded (0 B/s), 109.83 GiB downloaded (2.41 MiB/s)
2020/02/23 06:02:06 864.95 MiB peak memory used
ファイル数がバカ多いのもあるかもですが、約13時間かかった
code:60GBのダウンロード
2020/02/23 22:30:24 Preparation time 10s, sync time 8h 6m 32s
2020/02/23 22:30:24 Updated 0 Drive files, 134292 local files
2020/02/23 22:30:24 0 B read from disk, 59.42 GiB written to disk
2020/02/23 22:30:24 0 B uploaded (0 B/s), 59.42 GiB downloaded (2.08 MiB/s)
2020/02/23 22:30:24 801.88 MiB peak memory used
skicka でアカウントを切り替える
-metadata-cache-file
メタデータのキャッシュファイル
デフォルト: ~/.skicka.metadata.cache
-tokencache
トークンのキャッシュファイル
デフォルト: ~/.skicka.token.cache
これらを明示的に別ファイル指定して -no-browser-auth ls とでもすると別のアカウントでのセッションになる
config ファイルにこの設定を固定できれば -config だけで済むが…できない?
アップロード
アップロードしていきます
code:upload.sh
$ skicka skicka -metadata-cache-file ~/.skicka.metadata2.cache -tokencache ~/.skicka.token2.cache upload /mnt/disks/sdb/content /content
ディレクトリを作成してからファイルのアップロードに入るみたいなんですが、ディレクトリ23295個の作成に5時間かかると言われました。今日は放置して寝ます
code:upload
code:upload
めちゃ・時間かかるんだけど…
code:upload
2020/02/28 10:09:46 Preparation time 2m 57s, sync time 69h 1m 52s
2020/02/28 10:09:46 Updated 250029 Drive files, 0 local files
2020/02/28 10:09:46 73.19 GiB read from disk, 0 B written to disk
2020/02/28 10:09:46 73.19 GiB uploaded (308.80 kiB/s), 0 B downloaded (0 B/s)
2020/02/28 10:09:46 349.87 MiB peak memory used
手法に問題なさそうなので記事公開して終わりにします、現時点で5日かかってるのでだいたい500円ぐらいかかっています。
当たり前なのですが、小さいファイルがたくさんあるより大きいファイルが少しの方がスループットが出るので当然早いです。
あとダウンロードよりアップロードの方が体感2倍程度時間がかかります。